
/*
 * Ednei Leite da Silva
 * R.G.M.: 019250
 * 
 * Compilação:
 *      gcc -o main main.c servidor.c sniffer.c -lsqlite3 -lpcap -lcrypt -Wno-overlength-strings -Wall -pedantic
 */
#include "bibliotecas.h"
#include "servidor.h"
#include "sniffer.h"

int main(int argc, char **argv) {
    int local, remote;
    struct sockaddr_in local_host, remote_host;

    int tamanho, linha, logado;
    char *mensagem, *aux;

    local = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    local_host.sin_family = AF_INET;
    local_host.sin_addr.s_addr = INADDR_ANY;
    local_host.sin_port = htons(PORTA_SERVIDOR);

    /* Atribui uma porta ao socket*/
    if (bind(local, (struct sockaddr *) &local_host, sizeof (local_host)) == -1) {
        printf("Erro ao atribuir uma porta\n");
        return 1;
    }

    listen(local, 100);

    mensagem = (char*) malloc(sizeof (char) * BUFFER_SERVIDOR);
    aux = (char*) malloc(sizeof (char) * BUFFER_SERVIDOR);

    tamanho = sizeof (struct sockaddr_in);

    while (1) {
        if ((remote = accept(local, (struct sockaddr *) &remote_host, (socklen_t*) & tamanho)) < 0) {
            printf("ERRO AO RECEBER UMA CONEXAO");
            break;
        } else {

            linha = 1;
            logado = 0;

            while (linha != 0) {

                printf("\naguardando ...\n");

                linha = recv(remote, mensagem, BUFFER_SERVIDOR, MSG_WAITALL);

                if (linha <= 0) {
                    break;
                }

                bzero(aux, sizeof (char) * BUFFER_SERVIDOR);

                /* Caso o conteudo da mensagem seja nulo erra conexão */
                if (strlen(mensagem) < (STR_I_MENSAGEM_LEN + STR_F_MENSAGEM_LEN)) {
                    break;
                }

                printf("%s\n", mensagem);

                conteudo_mensagem(aux, mensagem);

                printf("%s : %s\n", aux, inet_ntoa(local_host.sin_addr));

                switch (operacao(aux)) {
                    case 1:
                        printf("INTERFACE\n");
                        aux = capturaInterfaces();
                        send(remote, aux, BUFFER_SERVIDOR, MSG_WAITALL);
                        break;

                    case 2:
                        printf("CAPTURA\n");
                        realiza_captura(aux, remote);
                        break;

                    case 3:
                        printf("LOGIN\n");
                        if (efetua_login(aux) == 1) {
                            strcpy(aux, "<mensagem>Login OK</mensagem>");
                            send(remote, aux, BUFFER_SERVIDOR, MSG_WAITALL);
                            printf("Login efetuado: %s\n", aux);
                            logado = 1;
                        }
                        break;

                    case 4:
                        printf("COMANDO\n");
                        executa_comando(remote);
                        break;

                    case 5:
                        printf("UPLOAD\n");
                        upload_regras(remote);
                        break;

                    case 6:
                        printf("FIM");
                        linha = 0;
                        break;

                    default:
                        printf("OPERAÇÃO NÃO CONHECIDA\n");
                        break;
                }

                if (logado == 0) {
                    printf("Falha oa efetuar login conexao encerrada...\n");
                    break;
                }
            }

            close(remote);

        }

        printf("FIM\n");
    }

    close(local);

    return 0;
}
